Avril 2012
Yffic

Petit point sur la gestion des erreurs et les exceptions de phpMailer 5. "Parce que c'est pnible de ne pas savoir pourquoi a ne marche pas"

Constat :
- Les problmes de connexion smtp ne sont pas affiches dans l'interface prive de SPIP aprs un test d'envoi via la page de config de Facteur. On a juste le message "Erreur: consultez le fichier log pour plus de dtails" dans un cadre rouge.

- Dans formulaires/configurer_facteur.php, facteur_envoyer_mail_test() renvoie true/false. Donc on n'a pas accs aux messages d'erreurs de phpMailer dans l'espace priv.

- La gestion des exceptions via la classe phpmailerException n'est pas active par dfaut dans phpMailer (Cf le constructeur). Elle sert surtout  faire remonter les messages d'erreur.

- Aprs avoir activ la gestion des exceptions et le mode debug de la classe smtp (qui ne fait que des echo), on peut remarquer que les messages d'erreurs affichs par les exceptions dans phpMailer ne reprennent pas les vraies causes d'erreurs releves dans la classe smtp. Si par exemple, on n'active pas ssl dans php, le debug "echo" affiche "SMTP -> ERROR: Failed to connect to server: Unable to find the socket transport "ssl" - did you forget to enable it when you configured PHP?", mais l'exception se contente d'un "SMTP Error: Could not connect to SMTP host" dans le fichier log. C'est quand mme dommage de ne pas avoir accs au premier message d'erreur.

- Voir aussi :
http://code.google.com/a/apache-extras.org/p/phpmailer/issues/detail?id=50
http://code.google.com/a/apache-extras.org/p/phpmailer/issues/detail?id=5

En attendant une ventuelle amlioration de phpMailer, on peut :

- Upgrader phpMailer 5.2.1. J'ai test, ca ne change rien au niveau de la gestion des messages d'erreur, mais a corrige d'autres trucs. 
05/04/12 : Un cas foireux avec la version 5.2.1 : Si comme hte on met un serveur ssl (ssl0.ovh.net), mais qu'on ne coche pas ssl au dessous, lors d'un test d'envoi, la roue Ajax tourne en rond indfiniment... Pas de retour, aucune trace meme avec de simples echo... Je pense que ca tourne en rond au niveau de la fonction feof de get_lines. Cf les Notes de http://php.net/manual/fr/function.feof.php... Il n'est pas donc pas si urgent d'upgrader...

- Redfinir dans la classe Facteur, les fonctions Send, AddAttachment, AddReplyTo, AddBCC, AddCC, de la classe PhpMailer de cette faon :
public function Send() {
	ob_start();
	parent::Send();
	$error = ob_get_contents();
	ob_end_clean();
	if( !empty($error) ) {
		spip_log("Erreur Facteur->Send : $error",'facteur.err');
	}
}
Avec une constante pour activer ce mode et rajouter au dbut du constructeur de Facteur :
if (defined('_FACTEUR_DEBUG_SMTP')) {
	$this->SMTPDebug = _FACTEUR_DEBUG_SMTP ;
}
Ajouter la ligne qui suit dans mes_options.php permet donc de retrouver les erreurs dans le fichier facteur.err.log. 
define('_FACTEUR_DEBUG_SMTP','5'); // Le niveau peut varier de 1  5, 5 affichant tout le dialogue lors de la connexion smtp avec le serveur



